#ifndef __PID_H__
#define __PID_H__

#include <stdbool.h>

//定义pid控制结构体
typedef struct {
	float pid_target;		//目标值
	float pid_Kp;			//比例系数
	float pid_Ki;			//积分系数
	float pid_Kd;			//微分系数
	
	float preErr ;	    	//用于保存上一次的误差值
	float prePreErr;		//保存上上次误差值	
	float pid_preU;			//上一次计算出来的pid值

	float AccuErr;			//积累误差

	float pid_out;			//控制输出值
	float max_out;			//最大值限幅输出，如果等于0表示不限幅
	float min_out;			//最小值限幅输出，如果等于0表示不限幅
} PID_CTL;

/******************************************************************************
 *函数名称：  setPidParameter
 *输入参数：  pid,pid控制体指针
 *            pidK、pidI、pidD,比例、积分、微分参数
 * 			  max、min：输出限幅，可正可负，为0表示不限幅
 *输出参数：  无
 *返回值  ：  无
 *功能描述：  设置PID参数，并初始化
 ******************************************************************************/
void setPidParameter(PID_CTL *pid, float pidK, float pidI, float pidD, float max, float min);

/******************************************************************************
 *函数名称：  setPidTarget
 *输入参数：  pid,pid控制体指针
 *            target,控制输出的目标值
 *输出参数：  无
 *返回值  ：  无
 *功能描述：  设置PID目标值
 ******************************************************************************/
void setPidTarget(PID_CTL *pid, float target);

/******************************************************************************
 *函数名称：  getPIDCtrlValue
 *输入参数：  pid,pid控制体指针
 *            feedback,反馈的实际值
 * 			  posi,true表示位置式PID，false表示增量式PID
 *输出参数：  无
 *返回值  ：  叠加PID后的控制值
 *功能描述：  此函数需要定时调用，计算PID核心函数。
 * 			  传入反馈值，PID计算后返回最终的控制值
 ******************************************************************************/
float getPIDCtrlValue(PID_CTL *pid, float feedback, bool posi);

#endif
